package com.qkl.xiatang.app.service.config;

import com.qkl.xiatang.app.dto.BusinessDTO;
import com.qkl.xiatang.app.entity.feed.FeedAllocConfig;
import com.qkl.xiatang.app.entity.feed.FeedAllocTemplate;
import com.qkl.xiatang.app.utils.AppDateUtils;
import com.qkl.xiatang.app.utils.AppSessionUtils;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class FeedAllocConfigUserService {

    @Autowired
    private FeedAllocConfigService feedAllocConfigService;

    /**
     * 查询饲料喂料配置
     * @param time
     * @return
     */
    public BusinessDTO<Object> queryFeedAllocConfig(String time){
         time = StringUtils.trimToEmpty(time);
         if( !AppDateUtils.checkDate(time)){
             return BusinessDTO.failBusiness("配料时间格式不符：" + time);
         }
         String companyId = AppSessionUtils.getCompanyId();
        Date allocDate = AppDateUtils.parseYyyy_mm_dd(time);
         List<FeedAllocTemplate> templateEntityList = feedAllocConfigService.getTemplateList(companyId);
         if(ObjectUtils.isEmpty(templateEntityList)){
             return BusinessDTO.failBusiness("配料时间模板未配置");
         }
        List<ConfigTemplateDTO> templateList = new ArrayList<>();
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd");
        SimpleDateFormat formatMemo = new SimpleDateFormat("MM月dd日");
         for(FeedAllocTemplate templateEntity : templateEntityList){
             ConfigTemplateDTO templateDTO = toTemplateDTO(templateEntity);
             List<FeedAllocConfig> configList = feedAllocConfigService.getConfigList(templateDTO.templateId);
             templateDTO.setConfigList(toConfigDTO(configList,allocDate,format,formatMemo));
             if(templateEntity.defaultTemplate()){
                 templateList.add(0,templateDTO);
             }else {
                 templateList.add(templateDTO);
             }
         }
        ConfigOutDTO outDTO = new ConfigOutDTO();
         outDTO.setTemplateList(templateList);
        return BusinessDTO.sucessBusiness(outDTO,"查询饲料喂料配置");
    }

    private static List<ConfigDTO> toConfigDTO(List<FeedAllocConfig> entityList,Date allocDate,SimpleDateFormat format,SimpleDateFormat formatMemo){
        if(ObjectUtils.isEmpty(entityList)){
            return new ArrayList<>();
        }
        List<ConfigDTO> configList = new ArrayList<>();
        List<ConfigDTO> configListNext = new ArrayList<>();
        for(FeedAllocConfig entity: entityList){
            ConfigDTO configDTO = toConfigDTO(entity,allocDate,format,formatMemo);
            if(configDTO.getDate().compareTo(allocDate) == 0){
                configList.add(configDTO);
            }else {
                configListNext.add(configDTO);
            }
        }
        configList.addAll(configListNext);
        return configList;
    }
    private static ConfigDTO toConfigDTO(FeedAllocConfig entity,Date allocDate,SimpleDateFormat format,SimpleDateFormat formatMemo){
        Date date = entity.toAllocDate(allocDate);
        ConfigDTO dto = new ConfigDTO();
        dto.setConfigId(entity.getId());
        dto.setName(entity.getName());
        dto.setSerialNo(entity.getSerialNo());
        dto.setAllocDate(format.format(date));
        dto.setAllocDateMemo(formatMemo.format(date) + dto.getName());
        dto.setDate(date);
        return dto;
    }

    private static ConfigTemplateDTO toTemplateDTO(FeedAllocTemplate entity){
        ConfigTemplateDTO dto = new ConfigTemplateDTO();
        dto.setIsDefault(entity.toDefaultValue());
        dto.setMemo(entity.getMemo());
        dto.setName(entity.getName());
        dto.setTemplateId(entity.getId());
        return dto;
    }

    @Data
    public static class ConfigOutDTO{
        private List<ConfigTemplateDTO> templateList;
    }

    @Data
    public static class ConfigTemplateDTO{
        private String templateId;
        private String name;
        private String memo;
        private int isDefault;
        private List<ConfigDTO> configList;
    }

    @Data
    public static class ConfigDTO{
        private String configId;
        //private String templateId;
        private Integer serialNo;
        private String name;
        private String allocDate;
        private String allocDateMemo;
        private Date date;
    }

}
